package com.tfswx.fljdmxyy.service.impl;

import com.newbie.core.exception.BusinessException;
import com.tfswx.fljdmxyy.constant.SystemConstant;
import com.tfswx.fljdmxyy.dao.RzYxCzrzMapper;
import com.tfswx.fljdmxyy.dao.RzYxYcrzMapper;
import com.tfswx.fljdmxyy.dto.rygl.RyxxOutputDTO;
import com.tfswx.fljdmxyy.dto.rzgl.*;
import com.tfswx.fljdmxyy.enums.BusinessCodeEnum;
import com.tfswx.fljdmxyy.model.RzYxCzrz;
import com.tfswx.fljdmxyy.model.RzYxYcrz;
import com.tfswx.fljdmxyy.query.rzgl.*;
import com.tfswx.fljdmxyy.service.RyglService;
import com.tfswx.fljdmxyy.service.RzglService;
import com.tfswx.fljdmxyy.utils.ConverterUtils;
import com.tfswx.fljdmxyy.utils.IpUtils;
import com.tfswx.fljdmxyy.utils.UuidUtils;
import com.tfswx.newbie.boot.starter.page.PageHelper;
import com.tfswx.newbie.boot.starter.page.PageParam;
import com.tfswx.newbie.boot.starter.page.PageResult;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 日志管理实现类
 *
 * @Author 陈文佳
 * @Date 2023/03/24
 */
@Service
public class RzglServiceImpl implements RzglService {

    @Resource
    private RzYxCzrzMapper czrzMapper;

    @Resource
    private RzYxYcrzMapper ycrzMapper;

    @Resource
    private RyglService ryglService;

    @Override
    public CzrzflQueryResult queryCzrzfl() {
        List<String> czrzfl = czrzMapper.queryCzrzfl();
        CzrzflQueryResult result = new CzrzflQueryResult();
        result.setCzrzflList(czrzfl);
        return result;
    }

    @Override
    public YcrzGetOutputDTO getYcrz(YcrzGetInputDTO dto) {
        RzYxYcrz ycrz = ycrzMapper.getRzYxYcrz(ConverterUtils.convert(dto, RzYxYcrz.class));
        return ConverterUtils.convert(ycrz, YcrzGetOutputDTO.class);
    }

    @Override
    public CzrzlxQueryResult queryCzrzlx() {
        CzrzlxQueryResult result = new CzrzlxQueryResult();
        List<String> czrzlx = czrzMapper.queryCzrzlx();
        result.setCzrzlxList(czrzlx);
        return result;
    }

    @Override
    public CzrzGetOutputDTO getCzrz(CzrzGetInputDTO dto) {
        RzYxCzrz czrz = czrzMapper.getRzYxCzrz(ConverterUtils.convert(dto, RzYxCzrz.class));
        return ConverterUtils.convert(czrz, CzrzGetOutputDTO.class);
    }

    @Override
    public YcrzSaveOutputDTO saveYcrz(YcrzSaveInputDTO dto) {
        RzYxYcrz ycrz = ConverterUtils.convert(dto, RzYxYcrz.class);
        Date now = new Date();
        ycrz.setRzbh(UuidUtils.uuid32());
        // 1.设置人员信息
        RyxxOutputDTO ryxxOutputDTO = ryglService.getUserInfo();
        ycrz.setCzrbm(ryxxOutputDTO.getRybm());
        ycrz.setCzrmc(ryxxOutputDTO.getRymc());
        ycrz.setCzrdwbm(ryxxOutputDTO.getDwbm());
        ycrz.setCzrdwmc(ryxxOutputDTO.getDwmc());
        ycrz.setCzrip(IpUtils.getIpAddress());
        ycrz.setSfsc(SystemConstant.N);
        ycrz.setCjsj(now);
        ycrz.setZhxgsj(now);

        // 2.新增异常日志
        Integer integer = ycrzMapper.insertRzYxYcrz(ycrz);
        if (integer < 1) {
            throw new BusinessException(BusinessCodeEnum.TJSJSB);
        }

        return ConverterUtils.convert(ycrz, YcrzSaveOutputDTO.class);
    }

    @Override
    public PageResult<CzrzQueryResult> queryCzrz(PageParam<CzrzQueryParam> param) {
        return PageHelper.doSelectPage(param, () -> czrzMapper.queryCzrz(param.getFilter()));
    }

    @Override
    public CzrzSaveOutputDTO saveCzrz(CzrzSaveInputDTO dto) {
        RzYxCzrz czrz = ConverterUtils.convert(dto, RzYxCzrz.class);
        Date now = new Date();
        czrz.setRzbh(UuidUtils.uuid32());
        // 1.设置操作人员信息
        RyxxOutputDTO ryxxOutputDTO = ryglService.getUserInfo();
        czrz.setCzrbm(ryxxOutputDTO.getRybm());
        czrz.setCzrmc(ryxxOutputDTO.getRymc());
        czrz.setCzrdwbm(ryxxOutputDTO.getDwbm());
        czrz.setCzrdwmc(ryxxOutputDTO.getDwmc());
        czrz.setCzrip(IpUtils.getIpAddress());
        czrz.setSfsc(SystemConstant.N);
        czrz.setCjsj(now);
        czrz.setZhxgsj(now);

        // 2.构造操作描述
        buildCzms(czrz);

        // 3.新增操作日志
        Integer integer = czrzMapper.insertRzYxCzrz(czrz);
        if (integer < 1) {
            throw new BusinessException(BusinessCodeEnum.TJSJSB);
        }

        return ConverterUtils.convert(czrz, CzrzSaveOutputDTO.class);
    }

    /**
     * 根据操作类型构造操作描述
     *
     * @param czrz
     */
    private void buildCzms(RzYxCzrz czrz) {
        if (StringUtils.isBlank(czrz.getCzms())) {
            String czms = String.format("[%s]在[%s]中进行[%s]操作", czrz.getCzrmc(), czrz.getRzfl(), czrz.getCzlx());
            czrz.setCzms(czms);
        }
    }

    @Override
    public PageResult<YcrzQueryResult> queryYcrz(PageParam<YcrzQueryParam> param) {
        return PageHelper.doSelectPage(param, () -> ycrzMapper.queryYcrz(param.getFilter()));
    }
}
